/*
 * MCAL_IO.c
 *
 *  Created on: Sep 24, 2025
 *      Author: ADMIN
 */


#include "MCAL_IO.h"

OutputIO_ID_Type OutPutIO_ID_A0;
OutputIO_ID_Type OutPutIO_ID_A3;
OutputIO_ID_Type OutPutIO_ID_E0;
OutputIO_ID_Type OutPutIO_ID_D3;

/* This Function is uesd to initialize the IO */
Std_ReturnType MCAL_OutputIO_Init(void)
{
	OutputIO_Creat(&Green_LED_Type,GPIOA,GPIO_PIN_3);
    Green_LED_Type.Set_Low(&Green_LED_Type);

	OutputIO_Creat(&RS485_ComtralIO,GPIOE,GPIO_PIN_0);
    RS485_ComtralIO.Set_Low(&RS485_ComtralIO);

    OutputIO_Creat(&Blue_LED_Type,GPIOA,GPIO_PIN_0);
    Blue_LED_Type.Set_Low(&Blue_LED_Type);

    OutputIO_Creat(&FlashCs_IO_Type,GPIOD,GPIO_PIN_3);
    FlashCs_IO_Type.Set_High(&FlashCs_IO_Type);
    return E_OK;
}

/* DeInit Function is uesd to Reinitialize the IO */
Std_ReturnType MCAL_OutputIO_DeInit(void)
{
    HAL_GPIO_DeInit(Green_LED_Type.io_port,Green_LED_Type.io_pin);
    HAL_GPIO_DeInit(RS485_ComtralIO.io_port,RS485_ComtralIO.io_pin);
    HAL_GPIO_DeInit(FlashCs_IO_Type.io_port,FlashCs_IO_Type.io_pin);
    HAL_GPIO_DeInit(Blue_LED_Type.io_port,Blue_LED_Type.io_pin);
    return E_OK;
}

/* This function can set the target io to HighPin */
Std_ReturnType OutputIO_Set_High(OutputIO_ID_Type* id)
{
    HAL_GPIO_WritePin(id->io_port,id->io_pin,GPIO_PIN_SET);
    if (HAL_GPIO_ReadPin(id->io_port,id->io_pin) == 1)
    {
        id->io_est = IO_HIGH_PIN;
        return E_OK;
    }
    else
    {
        return E_NOT_OK;
    }
}

/* This function can Reset the target io to LowPin */
Std_ReturnType OutputIO_Set_Low(OutputIO_ID_Type* id)
{
    HAL_GPIO_WritePin(id->io_port,id->io_pin,GPIO_PIN_RESET);
    if (HAL_GPIO_ReadPin(id->io_port,id->io_pin) == 0)
    {
        id->io_est = IO_LOW_PIN;
        return E_OK;
    }
    else
    {
        return E_NOT_OK;
    }    
}


Std_ReturnType OutputIO_UpdateStatus(OutputIO_ID_Type* id)
{
    if (HAL_GPIO_ReadPin(id->io_port,id->io_pin) == 1)
    {
        id->io_est = IO_HIGH_PIN;
    }
    else
    {
        id->io_est = IO_LOW_PIN;
    }
    return E_OK;
}

/* Creat a new OutPutIO */
void OutputIO_Creat(OutputIO_ID_Type* id,GPIO_TypeDef* port,uint16_t pin)
{
    id->io_port = port;
    id->io_pin = pin;
    OutputIO_UpdateStatus(id);
    id->Set_High = OutputIO_Set_High;
    id->Set_Low = OutputIO_Set_Low;
    id->UpdateStatus = OutputIO_UpdateStatus;    
}
